const path = require('path');
const fs = require('fs');
const loaderUtils = require('loader-utils');

/**
 * html中js处理
 * @param {*} content
 * @param {*} map
 * @param {*} meta
 * @returns
 */
module.exports = function jsScriptInLineLoader(content, map, meta) {
  console.log('/*=============== [loader1] start  ===============*/');
  let result;

  // 传递map，让source-map不中断
  // 传递meta，让下一个loader接收到其他参数
  // this.callback(null, content, map, meta);
  // return content; // 当调用 callback() 函数时，总是返回 undefined

  const options = this.getOptions();
  console.log(`[options]`, options);
  // 获取当前文件路径
  const loaderContext = this;
  console.log(`[this.resourcePath]`, this.resourcePath);
  // console.log(`[this.entry]`, this);
  // console.log(`[content]:`, content);

  try {
    /**
     * <script[\s\S]*?：匹配 <script 开始，之后是任意数量（包括零）的空白或非空白字符，直到遇到 src 属性。
     * src\s*=\s*：匹配 src 属性及其等号，等号前后可以有任意数量的空白字符。
     * ["']([^"']*)["']：匹配 src 属性的值，该值被单引号或双引号包围，并捕获不包含这些引号的值。
     * [\s\S]*?<\/script>：继续匹配直到遇到 </script> 结束标签，期间允许任何空白或非空白字符。
     */
    const reg = /<script[\s\S]*?src\s*=\s*["']([^"']*)["'][\s\S]*?<\/script>/g;

    // 改变html中的原js引用地址
    result = content.replace(reg, (match, src) => {
      console.log(`[match]: ${match}`);
      console.log(`[src]: ${src}`);
      // console.log(`[loaderContext]`, loaderContext);

      // 原文件路径
      const originFilePath = path.resolve(loaderContext.resourcePath, '../', src);

      // 目标输出文件路径
      const targetFilePath = path.resolve(process.cwd(), 'dist', src);

      console.log(`[originFilePath]: ${originFilePath}`);
      console.log(`[targetFilePath]:`, targetFilePath);

      // const fileContent = require(originFilePath);
      const fileContent = fs.readFileSync(originFilePath, 'utf-8');
      // console.log(`[fileContent]`, fileContent);
      console.log(`[loaderContext.emitFile]`, loaderContext.emitFile);

      // 根据src获取文件名称
      const fileName = path.basename(originFilePath);

      // 根据文件内容生成带hash值文件名
      const interpolatedName = loaderUtils.interpolateName(this, `[hash].${fileName}`, {
        content: fileContent,
      });

      console.log(`[输出目录]：`, `assets/js/${interpolatedName}`);

      // 将文件写入输出目录
      loaderContext.emitFile(`assets/js/${interpolatedName}`, fileContent);

      // 修改原文件路径为目标输出文件路径
      const fileSrc = './assets/js/' + src.replace(fileName, interpolatedName).replace('./', '');
      return `<script src="${fileSrc}"></script>`;
    });
  } catch (error) {
    console.log(`[error]`, error);
    return '';
  }

  // const useRes = formatCode(result);
  // console.log(`[useRes]:`, useRes);

  console.log('/*=============== [loader1] end  ===============*/');
  // return result;
  this.async()(null, result, map, meta);
};

/**
 * 格式化代码
 * 代替 html-loader
 *
 * @param {string} code
 * @returns {string}
 */
function formatCode(code) {
  return `
  // Module
  var code = \`${code}\`;
  // Exports
  export default code;
  `;
}
